<html>

	<head>
		<title>2.3 configRoute(Routes me)</title>
		<meta charset="utf-8" />
		<meta name="author" content="jfinal,yaolin" />
		<meta name="Keywords" content="" />
		<link rel="stylesheet" type="text/css" href="../../css/global.css" />
	</head>

	<body>
		<h1>2.3 configRoute(Routes me)</h1>
		<p>此方法用来配置 JFinal 访问路由，如下代码配置了将”/hello”映射到 HelloController 这个控 制 器 ， 通 过 以 下 的 配 置 ， http://localhost/hello 将 访 问 HelloController.index() 方 法 ， 而 http://localhost/hello/methodName 将访问到 HelloController.methodName()方法。</p>
		<img src="../../images/jfinalConfig/2.3.1.png" />
		<p>Routes.setBaseViewPath(baseViewPath)方法用于为该 Routes 内部的所有 Controller 设置视 图渲染时的基础路径，该基础路径与 Rutes.add(…, viewType)方法传入的 viewPath 以及 Controller.render(view) 方法传入的 view 参数联合组成最终的视图路径， 规则如下：</p>
		<p class="red">finalView = baseViewPath + viewPath + view</p>
		<p class="red">注意：当 view 以 “/” 字符打头时表示绝对路径， baseViewPath 与 viewPath 将被忽略。</p>
		<p>Routes 类中添加路由的方法有两个：</p>
		<img src="../../images/jfinalConfig/2.3.2.png" />
		<p>第一个参数 controllerKey 是指访问某个 Controller 所需要的一个字符串，该字符串唯一对 应一个 Controller， controllerKey 仅能定位到 Controller。 第二个参数 controllerClass 是该 controllerKey 所对应到的 Controller。第三个参数 viewPath 是指该 Controller 返回的视图的相对 路径(该参数具体细节将在 Controller 相关章节中给出)。 当 viewPath 未指定时默认值为 controllerKey。
		</p>
		<p class="red">JFinal 路由规则如下表：</p>
		<table border="1">
			<tr>
				<th>url 组成</th>
				<th>访问目标</th>
			</tr>
			<tr>
				<td>controllerKey</td>
				<td>YourController.index()</td>
			</tr>
			<tr>
				<td>controllerKey/method</td>
				<td>YourController.method()</td>
			</tr>
			<tr>
				<td>controllerKey/method/v0-v1</td>
				<td>YourController.method()， 所带 url 参数值为： v0-v1</td>
			</tr>
			<tr>
				<td>controllerKey/v0-v1</td>
				<td>YourController.index()， 所带 url 参数值为： v0-v1</td>
			</tr>
		</table>
		<p>从表中可以看出，JFinal 访问一个确切的 Action(Action 定义见 3.2 节)需要使用 controllerKey 与 method 来精确定位，当 method 省略时默认值为 index。 urlPara 是为了能在 url 中携带参数 值， urlPara 可以在一次请求中同时携带多个值， JFinal 默认使用减号“ -” 来分隔多个值（可 通过 constants. setUrlParaSeparator(String)设置分隔符）， 在 Controller 中可以通过 getPara(intindex)分别取出这些值。 controllerKey、 method、 urlPara 这三部分必须使用正斜杠“ /” 分隔。</p>
		<p>注意， controllerKey 自身也可以包含正斜杠“ /”，如“ /admin/article”，这样实质上实现了 struts2 的 namespace 功能。</p>
		<p>JFinal 在以上路由规则之外还提供了 ActionKey 注解， 可以打破原有规则，以下是代码示 例：
		</p>
		<img src="../../images/jfinalConfig/2.3.3.png" />
		<p>假定 UserController 的 controllerKey 值为“/user”，在使用了@ActionKey(“/login”)注解以 后， actionKey 由原来的“/user/login”变为了“/login”。 该注解还可以让 actionKey 中使用减号或 数字等字符，如“/user/123-456”。
		</p>
		<p>如果 JFinal 默认路由规则不能满足需求，开发者还可以根据需要使用 Handler 定制更加个 性化的路由，大体思路就是在 Handler 中改变第一个参数 String target 的值。</p>
		<p>JFinal 路由还可以进行拆分配置，这对大规模团队开发特别有用，以下是代码示例：</p>
		<img src="../../images/jfinalConfig/2.3.4.png" /><br>
		<img src="../../images/jfinalConfig/2.3.5.png" /><br>
		<img src="../../images/jfinalConfig/2.3.6.png" />
		<p>如上三段代码， FrontRoutes 类中配置了系统前端路由， AdminRoutes 配置了系统后端路由， MyJFinalConfig.configRoute(…)方法将拆分后的这两个路由合并起来。 使用这种拆分配置不仅 可以让 MyJFinalConfig 文件更简洁，而且有利于大规模团队开发，避免多人同时修改 MyJFinalConfig 时的版本冲突。</p>
		<p class="red">FrontRoutes 与 AdminRoutes 中 分 别 使 用 setBaseViewPath(…) 设 置 了 各 自 Controller.render(view)时使用的 baseViewPath。</p>
		<p><span class="red">AdminRoutes 还通过 addInterceptor(new AdminInterceptor())添加了 Routes 级别的拦截 器，该拦截器将拦截 AdminRoutes 中添加的所有 Controller，相当于业务层的 inject 拦截器， 会在 class 拦截器之前被调用。</span>这种用法可以避免在后台管理这样的模块中的所有 class 上使用 @Before(AdminInterceptor.class)，减少代码冗余。
		</p>
	</body>

</html>